package cn.caplike.demo.repository.java;

/**
 * 探讨代码块, 静态代码块的执行顺序<br>
 * <pre>
 *     通过反编译工具发现，代码块实际上是被放到了构造方法中，且是放在了构造方法的第一句，
 *     那么就不难解释为什么代码块会比构造方法执行顺序考前了，其实在我们执行子类的构造方法时，
 *     子类super指向父类的构造方法同时执行父类的构造方法，由于静态代码块执行是优先于main方法的，
 *     所以先回去执行父类的静态代码块再执行子类的静态代码块，然后此时super由于指向父类需要去执行父类的构造方法，
 *     且代码块会被转换到构造方法的第一行，所以此时就会执行父类的代码块以及构造方法，当super执行完毕回到子类时，
 *     由于子类的代码块也被放到了构造方法中，且在super之后所以执行子类代码块再执行子类构造方法。
 * </pre>
 *
 * @author LiKe
 * @version 1.0.0
 * @date 2020-03-14 21:45
 */
public class ExecuteSequence {
    public static void main(String[] args) {
        new Child().find();
    }
}

class Child extends Parent {
    static {
        System.out.println("子类静态代码块");
    }

    public Child() {
        System.out.println("子类构造方法");
    }

    {
        System.out.println("子类代码块");
    }


    static class Inner {
        static {
            System.out.println("111");
        }
    }

}

class Parent {
    static {
        System.out.println("父类静态代码块");
    }

    {
        System.out.println("父类代码块");
    }

    public Parent() {
        System.out.println("父类构造方法");
    }

    public static void find() {
        System.out.println("静态方法");
    }
}

